home *** CD-ROM | disk | FTP | other *** search
/ Graphics Plus / Graphics Plus.iso / general / viewers / polyview / polyvw20.lha / PolyView2.0 / Examples / md.c < prev    next >
C/C++ Source or Header  |  1991-07-26  |  7KB  |  351 lines

  1. /*
  2. MD.C
  3. NCSA Software Tools Group
  4. November 29, 1989
  5.  
  6. DESCRIPTION
  7. This program creates a sample HDF per-vertex data file useful for testing
  8. PolyView.  The file describes a number of simple three-dimensional objects and
  9. associated scientific data.
  10.  
  11. The created file is named "demo.hdf" and contains the following vgroups and
  12. vdatasets:
  13.  
  14.     group1    Vgroup containing all of the following data
  15.  
  16.     px    X dimension data set
  17.     py    Y dimension data set
  18.     pz    Z dimension data set
  19.  
  20.     plist3    connectivity list for triangles only
  21.     plist4    connectivity list for triangles and quadrilaterals
  22.  
  23.     random    random scientific data
  24. */
  25.  
  26. /* INCLUDES */
  27. #include <stdio.h>
  28. #include <ctype.h>
  29. #include "df.h"
  30. #include "dfi.h"
  31. #include "vg.h"
  32.  
  33.  
  34. /* DEFINES */
  35. #define POINTS    5000
  36. #define VERTS    5000
  37.  
  38. /* Random number generator information */
  39. #define MAX_RND         (1<<31)
  40. #define RND(min,max)    (double)(((((double)lcm_rnd())/(MAX_RND-1))*\
  41.                             ((double) max - (double) min)) + (double) min)
  42.  
  43.  
  44. /* TYPES */
  45.  
  46.  
  47. /* GLOBAL VARIABLES */
  48. float    px[VERTS];
  49. float    py[VERTS];
  50. float    pz[VERTS];
  51.  
  52. int    plist3[VERTS];
  53. int    plist4[VERTS];
  54.  
  55. float    random[VERTS];
  56.  
  57. int    np = 0;
  58. int    nv3 = 0;
  59. int    nv4 = 0;
  60.  
  61.  
  62. /* PROTOTYPES */
  63. unsigned long lcm_seed;
  64. void lcm_randomize(unsigned long);
  65. unsigned long lcm_rnd();
  66.  
  67. void init_vars();
  68. void gen_data();
  69. void write_to_hdf();
  70.  
  71.  
  72. /* MAIN */
  73. main(argc, argv)
  74.     int argc;
  75.     char * argv[];
  76. {
  77.     /* Initialize global variables */
  78.     init_vars();
  79.  
  80.     /* Generate the data for the file */
  81.     gen_data();
  82.  
  83.     /* Write the data to the file */
  84.     write_to_hdf();
  85. }
  86.  
  87.  
  88. /* FUNCTION DECLARATIONS */
  89.  
  90. void
  91. init_vars()
  92. /* DESCRIPTION:  Reinitializes all global variables to prepare for generating
  93. another set of data.
  94. */
  95. {
  96.     nv3 = 0;
  97.     nv4 = 0;
  98.     np = 0;
  99. }
  100.  
  101. void tetra(float, float, float, float);
  102. void rpp(float, float, float, float, float, float);
  103.  
  104. void
  105. gen_data()
  106. /* DESCRIPTION:  Generates data describing test world that we want to display.
  107. */
  108. {
  109.     float x, y, z;
  110.  
  111.     /* Create a field of tetrahedrons witha final row of rpps */
  112.     for (x = 0.0; x < 4.0; x += 1.0) {
  113.         for (z = 8.0; z >= 5.0; z -= 1.0) {
  114.             tetra(x, 0.0, z, 0.5);
  115.         }
  116.         rpp(x, 0.0, 4.0,  0.5, 0.5, 0.5);
  117.     }
  118.  
  119.     
  120.  
  121.     /* Create an aisle of rpps */
  122.     rpp(1.0, 0.0, 1.0,  0.5, 0.5, 2.5);
  123.     rpp(2.0, 0.0, 1.0,  0.5, 0.5, 2.5);
  124.  
  125.     /* Create an end for the aisle */
  126.     rpp(1.0, 0.0, 0.0,  1.5, 0.5, 0.5);
  127.  
  128.  
  129.     /* Create a final tunnel of cubes */
  130.     for (x = 3.0; x <= 14.0; x += 1.0) {
  131.         for (z = 0.0; z <= 1.0; z += 1.0) {
  132.             rpp(x, 0.0, z, 0.5, 0.5, 0.5);
  133.         }
  134.     }
  135.     
  136.     for (x = 2.5; x <= 14.5; x += 1.0) {
  137.         for (y = -0.5; y <= 0.5; y += 1.0) {
  138.             rpp(x, y, 0.5, 0.5, 0.5, 0.5);
  139.         }
  140.     }
  141.     
  142.  
  143. }
  144.  
  145.     int
  146.     add_pt(x, y, z)
  147.         float x, y, z;
  148.     /* DESCRIPTION:  Adds points x, y, and z to the px, py, and pz arrays,
  149.     respectively.  Also adds random number to the random array.  Increments 
  150.     np.
  151.     */
  152.     {
  153.         px[np] = x;
  154.         py[np] = y;
  155.         pz[np] = z;
  156.  
  157.         random[np] = RND(0.0, 1.0);
  158.  
  159.         np++;
  160.  
  161.         return np-1;
  162.     }
  163.  
  164.  
  165.     void
  166.     connect3(p0, p1, p2)
  167.         int p0, p1, p2;
  168.     /* DESCRIPTION:  Connects points p0, p1, p2 in the plist3 and plist4
  169.     arrays.  Increments nv3 and nv4. */
  170.     {
  171.         plist3[nv3*3+0] = p0+1;
  172.         plist3[nv3*3+1] = p1+1;
  173.         plist3[nv3*3+2] = p2+1;
  174.  
  175.         plist4[nv4*4+0] = p0+1;
  176.         plist4[nv4*4+1] = p1+1;
  177.         plist4[nv4*4+2] = p2+1;
  178.         plist4[nv4*4+3] = 0;
  179.  
  180.         nv3++;
  181.         nv4++;
  182.     }
  183.  
  184.  
  185.     void
  186.     connect4(p0, p1, p2, p3)
  187.         int p0, p1, p2, p3;
  188.     /* DESCRIPTION:  Connects points p0, p1, p2, p3 in the plist4 array.
  189.     Increments nv4. */
  190.     {
  191.         plist4[nv4*4+0] = p0+1;
  192.         plist4[nv4*4+1] = p1+1;
  193.         plist4[nv4*4+2] = p2+1;
  194.         plist4[nv4*4+3] = p3+1;
  195.  
  196.         nv4++;
  197.     }
  198.  
  199.  
  200.     void
  201.     tetra(x, y, z, a)
  202.         float x, y, z, a;
  203.     /* DESCRIPTION:  Adds the vertices for a tetrahedron with corner (x,y,z)
  204.     and edge a to the px, py, and pz arrays, and connects them in plist3
  205.     and plist4.  The plist4 entry is padded with a zero for the fourth
  206.     entry.
  207.     */
  208.     {
  209.         int p0, p1, p2, p3;
  210.  
  211.         /* Add the four points to the array */
  212.         p0 = add_pt(x,y,z);
  213.         p1 = add_pt(x+a,y,z);
  214.         p2 = add_pt(x,y+a,z);
  215.         p3 = add_pt(x,y,z+a);
  216.  
  217.         /* Connect the dots */
  218.         connect3(p0, p2, p1);
  219.         connect3(p0, p3, p2);
  220.         connect3(p0, p1, p3);
  221.         connect3(p1, p2, p3);
  222.     }
  223.  
  224.  
  225.     void
  226.     rpp(x, y, z, a, b, c)
  227.         float x, y, z, a, b, c;
  228.     /* DESCRIPTION:  Adds the vertices for a rectangular parallelpiped 
  229.     with near corner (x, y, z) and far corner (x+a, y+b, z+c) to the
  230.     px, py, and pz arrays, and connects them in plist4.
  231.     */
  232.     {
  233.         int p[8];
  234.  
  235.         /* Add the points to the array */
  236.         p[0] = add_pt(x, y, z);
  237.         p[1] = add_pt(x, y+b, z);
  238.         p[2] = add_pt(x+a, y+b, z);
  239.         p[3] = add_pt(x+a, y, z);
  240.         p[4] = add_pt(x, y, z+c);
  241.         p[5] = add_pt(x, y+b, z+c);
  242.         p[6] = add_pt(x+a, y+b, z+c);
  243.         p[7] = add_pt(x+a, y, z+c);
  244.  
  245.         /* Connect the dots */
  246.         connect4(p[0], p[1], p[2], p[3]);
  247.         connect4(p[5], p[6], p[2], p[1]);
  248.         connect4(p[0], p[4], p[5], p[1]);
  249.         connect4(p[0], p[3], p[7], p[4]);
  250.         connect4(p[2], p[6], p[7], p[3]);
  251.         connect4(p[7], p[6], p[5], p[4]);
  252.     }
  253.  
  254.  
  255. void
  256. write_to_hdf()
  257. /* DESCRIPTION:  Writes the data sets to the a new hdf file.
  258. */
  259. {
  260.     DF        * f;
  261.     VGROUP        * vg;
  262.     VDATA    * vs;
  263.     int        vgid, vsid;
  264.     int        n;
  265.  
  266.     /* Create the HDF file */
  267.     f = DFopen("demo.hdf", DFACC_ALL, 0);
  268.  
  269.  
  270.     /* Initialize Vgroup and Vsubgroup ids for creating new items */
  271.     vgid = -1;
  272.     vsid = -1;
  273.  
  274.     /* Create a Vgroup and name it "group1" */
  275.     vg = (VGROUP *) Vattach(f, -1, "w");
  276.     Vsetname(vg, "group1");
  277.  
  278.     /* Create px, py, and pz vdatasets and insert them in group1 */
  279.     vs = (VDATA *) VSattach(f, -1, "w");
  280.     VSsetname(vs, "px");
  281.     VSsetfields(vs, "px");
  282.     VSwrite(vs, px, np, NO_INTERLACE);
  283.     Vinsert(vg, vs);
  284.     VSdetach(vs);
  285.     vs = (VDATA *) VSattach(f, -1, "w");
  286.     VSsetname(vs, "py");
  287.     VSsetfields(vs, "py");
  288.     VSwrite(vs, py, np, NO_INTERLACE);
  289.     Vinsert(vg, vs);
  290.     VSdetach(vs);
  291.     vs = (VDATA *) VSattach(f, -1, "w");
  292.     VSsetname(vs, "pz");
  293.     VSsetfields(vs, "pz");
  294.     VSwrite(vs, pz, np, NO_INTERLACE);
  295.     Vinsert(vg, vs);
  296.     VSdetach(vs);
  297.  
  298.  
  299.     /* Create random scientific values dataset */
  300.     vs = (VDATA *) VSattach(f, -1, "w");
  301.     VSfdefine(vs, "random", LOCAL_FLOATTYPE, 1);
  302.     VSsetname(vs, "random");
  303.     VSsetfields(vs, "random");
  304.     VSwrite(vs, random, np, NO_INTERLACE);
  305.     Vinsert(vg, vs);
  306.     VSdetach(vs);
  307.  
  308.  
  309.     /* Create plist3 and plist4 vdatasets and insert them in group1 */
  310.     vs = (VDATA *) VSattach(f, -1, "w");
  311.  
  312.     VSfdefine(vs, "plist3", LOCAL_INTTYPE, 3);
  313.     VSsetname(vs, "plist3");
  314.     VSsetfields(vs, "plist3");
  315.     VSwrite(vs, plist3, nv3, NO_INTERLACE);
  316.     Vinsert(vg, vs);
  317.     VSdetach(vs);
  318.  
  319.     vs = (VDATA *) VSattach(f, -1, "w");
  320.     VSfdefine(vs, "plist4", LOCAL_INTTYPE, 4);
  321.     VSsetname(vs, "plist4");
  322.     VSsetfields(vs, "plist4");
  323.     VSwrite(vs, plist4, nv4, NO_INTERLACE);
  324.     Vinsert(vg, vs);
  325.     VSdetach(vs);
  326.  
  327.  
  328.     /* Close up the file */
  329.     Vdetach(vg);
  330.     DFclose(f);
  331. }
  332.  
  333.  
  334. /* RANDOM NUMBER GENERATOR FUNCTIONS */
  335.  
  336. void lcm_randomize(seed)
  337.         unsigned long seed;
  338. {
  339.         lcm_seed = seed;
  340. }
  341.  
  342.  
  343. unsigned long lcm_rnd()
  344. {
  345.         unsigned long rnd_val;
  346.  
  347.         rnd_val = lcm_seed;
  348.         lcm_seed = ((314159269 * lcm_seed) + 453806245) % MAX_RND;
  349.         return (rnd_val);
  350. }
  351.